
// 对Date的扩展，将 Date 转化为指定格式的String
// 月(M)、日(D)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符，
// 年(Y)可以用 1-4 个占位符，毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
// 例子：
// (new Date()).Format("YYYY-MM-DD hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
// (new Date()).Format("YYYY-M-D h:m:s.S")      ==> 2006-7-2 8:9:4.18
// (new Date("2023-5-23")).Format("YYYY-MM-DD hh:mm:ss")
Date.prototype.Format = function (fmt, newtime) {
    var thistime = this;
    //兼容设置
    if (!thistime.getFullYear() && newtime) {
        thistime = new Date(getFormatTime(newtime))
    }

    var o = {
        "M+": thistime.getMonth() + 1, //月
        "D+": thistime.getDate(), //日
        "h+": thistime.getHours(), //时
        "m+": thistime.getMinutes(), //分
        "s+": thistime.getSeconds(), //秒
        "q+": Math.floor((thistime.getMonth() + 3) / 3), //季度
        "S": thistime.getMilliseconds() //毫秒
    };
    if (/(Y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (thistime.getFullYear() + "").substr(4 - RegExp.$1.length));
    for (var k in o)
        if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
    return fmt;
}


// 按时间当天与当年呈现时间
function resetnow(_time) {
    var now = new Date();
    var time = new Date(_time);
    if (!time.getFullYear()) {
        time = new Date(getFormatTime(_time))
    }
    if (time.getFullYear() == now.getFullYear()) {
        var today = new Date();
        today.setHours(0, 0, 0, 0);
        today = today.getTime();
        var h = 1000 * 60 * 60, s = now.getTime() - time.getTime();
        if(s < h){
            var m = parseInt(s / 60000);
            return m>0?m+"分钟前":"刚刚";
        }else if (today < time.getTime()) {
            return '今天 ' + time.Format("hh:mm:ss", _time);
        } else if (today-time.getTime() < h*24) {
            return '昨天 ' + time.Format("hh:mm:ss", _time);
        }
        return time.Format("MM/DD hh:mm", _time);
    }
    return time.Format("YYYY/MM/DD", _time);
}


//日期兼容设置 针对格式 2020-12-1 14:49:00 +00:00
function getFormatTime(newtime) {
    if(newtime>0){
        return newtime;
    }
    var parse = Date.parse(newtime);
    if(parse){
        return parse;
    }
    var fmtArr = String(newtime).split(' ');
    var rq = fmtArr[0].replace(/-/g, "/");
    var sj = String(fmtArr[1]).split('.')[0];
    var hm = Number(String(fmtArr[1]).split('.')[1]);
    //var sq = fmtArr[2] ? String(fmtArr[2]).match(/[^\+|^\-]+(?=\:)/) : 0;
    //sq = sq ? (Number(sq[0]) * 60 * 60 * 1000) : 0;
    //计算时区差额
    var sq = fmtArr[2] ? (new Date(rq + ' ' + fmtArr[2].substr(1))).getTime() - (new Date(rq)).getTime() : 0;
    var _time = (new Date(rq + ' ' + sj)).getTime() + hm;
    var zz = (new Date()).getTimezoneOffset() * 60 * 1000;
    return (fmtArr[2] && String(fmtArr[2]).substr(0, 1) == '+') ? _time - sq - zz : _time + sq - zz;
}


function ppwrap(text) {
    //将回车符换成p标签
    return text != "" && text != null ? '<p>' + text.replace(/\r/g, '').replace(/\n*$/g, '').replace(/\n/g, '</p><p>') + '</p>' : "";
}

function base64ToBlob(urlData) {
    var arr = urlData.split(','), mime = arr[0].match(/:(.*?);/)[1],
        bstr = atob(arr[1].replace(/\s|\n/g, "")), n = bstr.length, u8arr = new Uint8Array(n);
    while (n--) {
        u8arr[n] = bstr.charCodeAt(n);
    }
    return new Blob([u8arr], { type: mime });
}

//合并Object(原始Obj, 新的)
function objextend(a, b) {
    for (var key in b) {
        if (b.hasOwnProperty(key)) {
            a[key] = b[key];
        }
    }
    return a;
}

/**
 * 扁平化树形结构数据
 * @param {树形数据} tree 
 * @param {子集属性名} children 
 * @returns 
 */
function flattenTree(tree, children) {
    tree = JSON.parse(JSON.stringify(tree));
    const result = [];
    const stack = [...tree];
    while (stack.length > 0) {
        const node = stack.pop();
        result.unshift(node);
        if (node[children]) {
            stack.push(...node[children]);
        }
    }
    return result;
}

// 前端保存文件
function onDownFile(obj) {
    const filetype = obj.name.split('.')[1];
    var url = '';
    if(obj.canvas){
        url = canvas.toDataURL(filetype=="png"?"image/png":"image/jpeg", 0.9)
    }else if(obj.blob){
        url = window.URL.createObjectURL(obj.blob)
    }else{
        url = obj.url;
    }
    var a = document.createElement("a");
    a.download = obj.name;
    a.href = url;
    a.style.display = 'none';
    document.body.appendChild(a);
    a.click();
    a.remove();
}

// 获取header头中的文件名
// res.headers['content-disposition'] || res.headers['Content-Disposition'];
function exportName(str) {
    if (typeof str !== 'string') {
        return '';
    }
    // 优先尝试匹配 filename*=和filename=，支持双引号包裹的文件名
    const match = str.match(/filename\*?=(utf-8'')?("([^"]+)"|([^;]+))/);
    if (match) {
        // 匹配双引号包裹的文件名
        if (match[3]) {
            return decodeURIComponent(match[3]);
        }
        // 匹配不带双引号的文件名
        if (match[4]) {
            return decodeURIComponent(match[4]);
        }
    }
    return '';
}

//------拖拽排序------
//部分元素需要 draggable="true"
const dragList = {
    data() {
        return {
            dragIndex: 0,
        }
    },
    dragstart(index) {
        this.dragIndex = index;
    },
    dragenter(e, index, list) {
        e.preventDefault();
        // 避免源对象触发自身的dragenter事件
        if (this.dragIndex !== index) {
            const source = list[this.dragIndex];
            list.splice(this.dragIndex, 1);
            list.splice(index, 0, source);
            // 排序变化后目标对象的索引变成源对象的索引
            this.dragIndex = index;
            typeof list[index] === 'object' && (list[index].sort = index+1);
            // console.log(this.dragIndex, list);
        }
    },
    dragover(e) {
        e.preventDefault();
    },
}


export {
	base64ToBlob,resetnow,objextend,flattenTree,onDownFile,exportName,dragList
};